// package com.xjtu.netty;
//
// import com.alibaba.fastjson.JSON;
// import com.xjtu.view.Chat;
// import io.netty.channel.Channel;
// import io.netty.channel.ChannelHandlerContext;
// import io.netty.channel.SimpleChannelInboundHandler;
// import io.netty.channel.group.ChannelGroup;
// import io.netty.channel.group.DefaultChannelGroup;
// import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
// import io.netty.util.concurrent.GlobalEventExecutor;
//
// import java.util.Date;
// import java.util.concurrent.ConcurrentHashMap;
//
//
// /**
//  * 专门处理文本消息的handler
//  */
// public class ChatHandlerTest extends SimpleChannelInboundHandler<TextWebSocketFrame> {
//     //记录所有客户端通道
//     public final static ChannelGroup CHANNELS = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
//     //记录
//     private final static ConcurrentHashMap<String, Integer> USER_CHANNEL_MAP = new ConcurrentHashMap<>();
//
//
//     //客户端携带userId连接，进入聊天室
//     @Override
//     public void handlerAdded(ChannelHandlerContext ctx) {
//         CHANNELS.add(ctx.channel());
//
//         // AttributeKey<Long> key = AttributeKey.valueOf("userId");
//         // Long userId = ctx.channel().attr(key).get();
//         // ChannelManager.put(userId, ctx.channel());
//     }
//
//
//     //客户端发送消息
//     @Override
//     protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
//         //获取客户端连接的通道
//         Channel channel = ctx.channel();
//         //获取客户端传输的消息
//         String message = msg.text();
//
//         //将客户端消息解析为Chat对象
//         Chat chat = JSON.parseObject(message, Chat.class);
//         int from = chat.getFrom();
//         int to = chat.getTo();
//         int type = chat.getType().getCode();
//         String content = chat.getContent();
//         boolean read = false;
//
//         if (action == 1) {
//             //2.2 聊天类型的消息，把聊天记录保存到数据库，同时根据接收者的状态决定消息的状态
//             Chat record = new Chat();
//             Channel toChannel = ChannelManager.get((long) to);
//             if (toChannel == null) {
//                 // 用户尚未连接
//                 //record.setContent(Encode.encrypt(messageDto.getText(), Encode.password));
//                 record.setRead(false);
//                 record.setTo(to);
//                 record.setFrom(from);
//             } else {
//                 record.setContent(chat.getContent());
//                 record.setRead(true);
//                 record.setTo(to);
//                 record.setFrom(from);
//
//                 //当receiverChannel 不为空的时候，从ChannelGroup 去查找对应的channel 是否存在
//                 Channel findChannel = CHANNELS.find(toChannel.id());
//                 if (findChannel != null) {
//                     // 用户在线
//                     toChannel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(chat)));
//                 } else {
//                     // 用户离线
//                     System.out.println("用户离线，找不到channel");
//                 }
//             }
//         }  else if (action == 2) {
//             //2 图片 和文件，和 1 的区别在于不对内容进行加密
//
//             Chat record = new Chat();
//             Channel receiverChannel = ChannelManager.get((long) to);
//             if (receiverChannel == null) {
//                 // 用户尚未连接
//                 record.setContent(chat.getContent());
//                 record.setRead(false);
//                 record.setTime(new Date());
//                 record.setTo(to);
//                 record.setFrom(from);
//             } else {
//                 record.setContent(chat.getContent());
//                 record.setRead(true);
//
//                 //当receiverChannel 不为空的时候，从ChannelGroup 去查找对应的channel 是否存在
//                 Channel findChannel = CHANNELS.find(receiverChannel.id());
//                 if (findChannel != null) {
//                     // 用户在线
//                     receiverChannel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(chat)));
//                 } else {
//                     // 用户离线
//                     System.out.println("用户离线，找不到channel");
//                 }
//             }
//         } else if (action == 3) {
//             // 系统通知，不保存数据库，只做转发
//             Channel receiverChannel = ChannelManager.get((long) to);
//             if (receiverChannel != null) {
//                 Channel findChannel = CHANNELS.find(receiverChannel.id());
//                 if (findChannel != null) {
//                     // 用户在线
//                     receiverChannel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(chat)));
//                 }
//             }
//         } else if (action == 4) {
//             System.out.println("收到来自channel 为【"+channel+"】的心跳包");
//         }
//     }
//
//
//     //客户端断开，离开聊天室
//     @Override
//     public void handlerRemoved(ChannelHandlerContext ctx) {
//         CHANNELS.remove(ctx.channel());
//
//         // AttributeKey<Long> key = AttributeKey.valueOf("userId");
//         // Long userId = ctx.channel().attr(key).get();
//         // ChannelManager.remove(userId);
//     }
//
//
//     //消息处理异常
//     @Override
//     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
//         cause.printStackTrace();
//         CHANNELS.remove(ctx.channel());
//         ctx.channel().close();
//
//         // AttributeKey<Long> key = AttributeKey.valueOf("userId");
//         // Long userId = ctx.channel().attr(key).get();
//         // ChannelManager.remove(userId);
//     }
// }
